package day1102.demo01;

/**
 * @program: qy158
 * @description:
 * @author: 闫克起2
 * @create: 2022-11-02 09:14
 **/

import java.util.Hashtable;
import java.util.concurrent.*;

/**
 * Executor  线程池的顶级接口: 在该接口只有一个抽象方法void execute(Runnable command);
 *      该方法用来执行Runnable类型的任务。
 *   ExecutorService: 它是Executor的子接口，它里面包含的方法:
 *       void shutdown(); 关闭线程池，当线程池中有运行的任务，则等任务执行完后才关闭
 *       List<Runnable> shutdownNow(); 立即关闭线程池，当前线程池中有任务执行，则立即关闭任务。
 *       boolean isShutdown(); 判断线程池是否关闭。
 *       boolean isTerminated();判断线程池是否终止。
 *       <T> Future<T> submit(Callable<T> task); 提交Callable类型的任务给线程池。
 *       Future<?> submit(Runnable task); 提交Runnable类型的任务给线程池
 *
 *Executors: 它是一个工具类，可以帮你创建相应的线程池对象。
 *      (1)newSingleThreadExecutor 创建单一线程池：适合只有单线程执行，要求线程按照顺序执行。
 *      (2)newFixedThreadPool    创建固定长度的线程池:   适合服务器负载比较重。
 *      (3) newCachedThreadPool      创建可变线程池:  适合短期任务比较重。
 *      (4) newScheduledThreadPool     创建延迟线程池:   适合延期执行任务的线程。
 */
public class TestExecutors {
    public static void main(String[] args) {
        //创建单一线程池---池子中有且仅有一个线程对象。
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //创建固定长度的线程池----池子中线程的数量是固定的。---里面预先会创建n个线程对象。
//        ExecutorService executorService = Executors.newFixedThreadPool(5);

        //创建可变长度的线程池----根据任务个数动态创建线程对象。
        //ExecutorService executorService = Executors.newCachedThreadPool();

//        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);

        /*
        int corePoolSize, 核心线程的个数
      int maximumPoolSize, 最大线程的个数
      long keepAliveTime, 线程对象空闲的时间
      TimeUnit unit, 空闲时间单位
      BlockingQueue<Runnable> workQueue：等待队列
         */
        ThreadPoolExecutor executorService=new ThreadPoolExecutor(2,5,
                2000,TimeUnit.SECONDS,new LinkedBlockingDeque(3));
        //往线程池中提交任务。
        for(int i=0;i<30;i++){
            final int a=i;
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"~~~~~~"+a);
                }
            });
        }

//        Hashtable 它是安全的 但是它使用了syn锁，导致效率慢。

    }
}
